package service;

import org.apache.flink.api.common.state.ListState;
import pojo.LogBean;
import pojo.RuleAutomicParam;
import pojo.RuleParam;
//import utils.RuleCalUtils;
import java.util.List;

public class UserActionCountQuerySericeImpl implements UserActionCountQuerySerice {
    /**
     * 查询每个事件的次数是否满足条件
     * @param listState a
     * @param ruleParam  a
     * @return
     * @throws Exception
     *
     * 注意：这里因为状态必须要用flink的，为了解耦，我们这里需要flink调用的时候，传给我们一个状态
     */
    public  Boolean   UserActionCountQueryFromstate(String  deviceId,ListState<LogBean>  listState, RuleParam ruleParam) throws Exception {
        //todo  拿出当前用户历史状态数据
        Iterable<LogBean> logBeans = listState.get();
        List<RuleAutomicParam> userActionParam = ruleParam.getUserActionParam();

        queryHelper(logBeans, userActionParam);

        //经过上面的操作，每个原子条件都有了一个真实的发生的次数。
        //我们需要保证每个原子规则的次数都要成立，并且你来一条数据就会去匹配我们的条件。
        for (RuleAutomicParam ruleAutomicParam : userActionParam) {
            if(ruleAutomicParam.getRealcount() >= ruleAutomicParam.getCount()){
                return   false ;
            }
        }
        return true ;
    }

    /**
     * 为了方便测试，我们这里剥离出来
     * 根据传入的历史明细，和规则条件，统计每一个规则原子条件发生的次数，并将结果set到嘴硬的值
     * @param logBeans  a
     * @param userActionParam  a
     * @return
     */
    public   void  queryHelper(Iterable<LogBean>  logBeans, List<RuleAutomicParam>   userActionParam){
        //进来的事件和参数的事件一定要相同
        for (LogBean logBean : logBeans) {
            //这里这么理解：对于状态里面的每一个logbean,我们都要拿到他的eventid,和用户给我们传的参数做比对
            for (RuleAutomicParam ruleAutomicParam : userActionParam) {
                //先判断我们的事件和和当前的参数是否一致,如果一致，就比较当前的事件的属性和传入属性的值是否相同【先拿到用户的属性，】
//                Boolean aBoolean = RuleCalUtils.eventProfileMatchUseProfile(logBean, ruleAutomicParam);
                //如果一致，就count+1
                if(true){
                    int  realcount = ruleAutomicParam.getRealcount();
                    realcount++;//真实次数加一
                    ruleAutomicParam.setRealcount(realcount);
                }
                //否则,啥也不做
            }
        }
    }

}
